home *** CD-ROM | disk | FTP | other *** search
- /* zipCheck.main.c */
- /* ==================================================================== */
- /* HyperCard zipcode verfication function */
- /* SYNTAX: zipCheck(<"ZIPCODE">) */
- /* ZIPCODE must be either a 5-digit zipcode or */
- /* a 9-digit zip in the form "68938-0123" (10 characters) */
- /* RETURNS: Correct state abbreviation for valid zipcode; or */
- /* Null & beep for invalid zipcode */
- /* */
- /* © Copyright 1988 Sam Thornton, PO Box 123, Fairfield, NE 68938-0123 */
- /* May be copied & distributed without charge only. Not for commercial */
- /* sale or resale. */
- /* Written in LSC 3.0 9/6/88 - some portions © by Symantec */
- /* MODIFIED 10/14/88 */
- /* ==================================================================== */
-
- #include "HyperXCmd.h"
- #include "SetUpA4.h"
- #include "MemoryMgr.h"
- #include "strings.h"
- #include "stdio.h"
- #include "ctype.h"
-
- typedef struct zip {
- char zipcode[4];
- char state[3];
- } zip;
-
- /* Zipcode table lists valid 3-digit zipcodes for 50 states (ca. 1/88). */
- /* You can add or delete any number of other zipcodes (e.g. Puerto Rico)*/
- /* BUT zips MUST be in numeric order. Each table entry consists of a */
- /* 3-digit zip followed by the corresponding state abbreviation. */
-
- zip zip_table[] = {
- "010", "MA", "011", "MA", "012", "MA", "013", "MA", "014", "MA",
- "015", "MA", "016", "MA", "017", "MA", "018", "MA", "019", "MA",
- "020", "MA", "021", "MA", "022", "MA", "023", "MA", "024", "MA",
- "025", "MA", "026", "MA", "027", "RI", "028", "RI", "029", "RI",
- "030", "NH", "031", "NH", "032", "NH", "033", "NH", "034", "NH",
- "035", "VT", "036", "VT", "037", "VT", "038", "NH", "039", "NH",
- "040", "ME", "041", "ME", "042", "ME", "043", "ME", "044", "ME",
- "045", "ME", "046", "ME", "047", "ME", "048", "ME", "049", "ME",
- "050", "VT", "051", "VT", "052", "VT", "053", "VT", "054", "VT",
- "056", "VT", "057", "VT", "058", "VT", "059", "NH", "060", "CT",
- "061", "CT", "062", "CT", "063", "CT", "064", "CT", "065", "CT",
- "066", "CT", "067", "CT", "068", "CT", "069", "CT", "070", "NJ",
- "071", "NJ", "072", "NJ", "073", "NJ", "074", "NJ", "075", "NJ",
- "076", "NJ", "077", "NJ", "078", "NJ", "079", "NJ", "080", "NJ",
- "081", "NJ", "082", "NJ", "083", "NJ", "084", "NJ", "085", "NJ",
- "086", "NJ", "087", "NJ", "088", "NJ", "089", "NJ", "100", "NY",
- "101", "NY", "102", "NY", "103", "NY", "104", "NY", "105", "NY",
- "106", "NY", "107", "NY", "108", "NY", "109", "NY", "110", "NY",
- "111", "NY", "112", "NY", "113", "NY", "114", "NY", "115", "NY",
- "116", "NY", "117", "NY", "118", "NY", "119", "NY", "120", "NY",
- "121", "NY", "122", "NY", "123", "NY", "124", "NY", "125", "NY",
- "126", "NY", "127", "NY", "128", "NY", "129", "NY", "130", "NY",
- "131", "NY", "132", "NY", "133", "NY", "134", "NY", "135", "NY",
- "136", "NY", "137", "NY", "138", "NY", "139", "NY", "140", "NY",
- "141", "NY", "142", "NY", "143", "NY", "144", "NY", "145", "NY",
- "146", "NY", "147", "NY", "148", "NY", "149", "NY", "150", "PA",
- "151", "PA", "152", "PA", "153", "PA", "154", "PA", "155", "PA",
- "156", "PA", "157", "PA", "158", "PA", "159", "PA", "160", "PA",
- "161", "PA", "162", "PA", "163", "PA", "164", "PA", "165", "PA",
- "166", "PA", "167", "PA", "168", "PA", "169", "PA", "170", "PA",
- "171", "PA", "172", "PA", "173", "PA", "174", "PA", "175", "PA",
- "176", "PA", "177", "PA", "178", "PA", "179", "PA", "180", "PA",
- "181", "PA", "182", "PA", "183", "PA", "184", "PA", "185", "PA",
- "186", "PA", "187", "PA", "188", "PA", "189", "PA", "190", "PA",
- "191", "PA", "193", "PA", "194", "PA", "195", "PA", "196", "PA",
- "197", "DE", "198", "DE", "199", "DE", "200", "DC", "202", "DC",
- "203", "DC", "204", "DC", "205", "DC", "206", "MD", "207", "MD",
- "208", "MD", "209", "MD", "210", "MD", "211", "MD", "212", "MD",
- "213", "MD", "214", "MD", "215", "MD", "216", "MD", "217", "MD",
- "218", "MD", "219", "MD", "220", "VA", "221", "VA", "222", "VA",
- "223", "VA", "224", "VA", "225", "VA", "226", "VA", "227", "VA",
- "228", "VA", "229", "VA", "230", "VA", "231", "VA", "232", "VA",
- "233", "VA", "234", "VA", "235", "VA", "236", "VA", "237", "VA",
- "238", "VA", "239", "VA", "240", "VA", "241", "VA", "242", "VA",
- "243", "VA", "244", "VA", "245", "VA", "246", "WV", "247", "WV",
- "248", "WV", "249", "WV", "250", "WV", "251", "WV", "252", "WV",
- "253", "WV", "254", "WV", "255", "WV", "256", "WV", "257", "WV",
- "258", "WV", "259", "WV", "260", "WV", "261", "WV", "262", "WV",
- "263", "WV", "264", "WV", "265", "WV", "266", "WV", "267", "WV",
- "268", "WV", "270", "NC", "271", "NC", "272", "NC", "273", "NC",
- "274", "NC", "275", "NC", "276", "NC", "277", "NC", "278", "NC",
- "279", "NC", "280", "NC", "281", "NC", "282", "NC", "283", "NC",
- "284", "NC", "285", "NC", "286", "NC", "287", "NC", "288", "NC",
- "289", "NC", "290", "SC", "291", "SC", "292", "SC", "293", "SC",
- "294", "SC", "295", "SC", "296", "SC", "297", "SC", "298", "GA",
- "299", "GA", "300", "GA", "301", "GA", "302", "GA", "303", "GA",
- "304", "GA", "305", "GA", "306", "GA", "307", "GA", "308", "GA",
- "309", "GA", "310", "GA", "311", "GA", "312", "GA", "313", "GA",
- "314", "GA", "315", "GA", "316", "GA", "317", "GA", "318", "GA",
- "319", "GA", "320", "FL", "321", "FL", "322", "FL", "323", "FL",
- "324", "FL", "325", "FL", "326", "FL", "327", "FL", "328", "FL",
- "329", "FL", "330", "FL", "331", "FL", "332", "FL", "333", "FL",
- "334", "FL", "335", "FL", "336", "FL", "337", "FL", "338", "FL",
- "339", "FL", "340", "FL", "342", "FL", "350", "AL", "351", "AL",
- "352", "AL", "354", "AL", "355", "AL", "356", "AL", "357", "AL",
- "358", "AL", "359", "AL", "360", "AL", "361", "AL", "362", "AL",
- "363", "AL", "364", "AL", "365", "AL", "366", "AL", "367", "AL",
- "368", "AL", "369", "AL", "370", "TN", "371", "TN", "372", "TN",
- "373", "TN", "374", "TN", "376", "TN", "377", "TN", "378", "TN",
- "379", "TN", "380", "TN", "381", "TN", "382", "TN", "383", "TN",
- "384", "TN", "385", "TN", "386", "MS", "387", "MS", "388", "MS",
- "389", "MS", "390", "MS", "391", "MS", "392", "MS", "393", "MS",
- "394", "MS", "395", "MS", "396", "MS", "397", "MS", "400", "KY",
- "401", "KY", "402", "KY", "403", "KY", "404", "KY", "405", "KY",
- "406", "KY", "407", "KY", "408", "KY", "409", "KY", "410", "KY",
- "411", "KY", "412", "KY", "413", "KY", "414", "KY", "415", "KY",
- "416", "KY", "417", "KY", "418", "KY", "420", "KY", "421", "KY",
- "422", "KY", "423", "KY", "424", "KY", "425", "KY", "426", "KY",
- "427", "KY", "430", "OH", "431", "OH", "432", "OH", "433", "OH",
- "434", "OH", "435", "OH", "436", "OH", "437", "OH", "438", "OH",
- "439", "OH", "440", "OH", "441", "OH", "442", "OH", "443", "OH",
- "444", "OH", "445", "OH", "446", "OH", "447", "OH", "448", "OH",
- "449", "OH", "450", "OH", "451", "OH", "452", "OH", "453", "OH",
- "454", "OH", "455", "OH", "456", "OH", "457", "OH", "458", "OH",
- "460", "IN", "461", "IN", "462", "IN", "463", "IN", "464", "IN",
- "465", "IN", "466", "IN", "467", "IN", "468", "IN", "469", "IN",
- "470", "IN", "471", "IN", "472", "IN", "473", "IN", "474", "IN",
- "475", "IN", "476", "IN", "477", "IN", "478", "IN", "479", "IN",
- "480", "MI", "481", "MI", "482", "MI", "483", "MI", "484", "MI",
- "485", "MI", "486", "MI", "487", "MI", "488", "MI", "489", "MI",
- "490", "MI", "491", "MI", "492", "MI", "493", "MI", "494", "MI",
- "495", "MI", "496", "MI", "497", "MI", "498", "MI", "499", "MI",
- "500", "IA", "501", "IA", "502", "IA", "503", "IA", "504", "IA",
- "505", "IA", "506", "IA", "507", "IA", "508", "IA", "509", "IA",
- "510", "IA", "511", "IA", "512", "IA", "513", "IA", "514", "IA",
- "515", "IA", "516", "IA", "520", "IA", "521", "IA", "522", "IA",
- "523", "IA", "524", "IA", "525", "IA", "526", "IA", "527", "IA",
- "528", "IA", "529", "IA", "530", "WI", "531", "WI", "532", "WI",
- "534", "WI", "535", "WI", "537", "WI", "538", "WI", "539", "WI",
- "540", "WI", "541", "WI", "542", "WI", "543", "WI", "544", "WI",
- "545", "WI", "546", "WI", "547", "WI", "548", "WI", "549", "WI",
- "550", "MN", "551", "MN", "553", "MN", "554", "MN", "556", "MN",
- "557", "MN", "558", "MN", "559", "MN", "560", "MN", "561", "MN",
- "562", "MN", "563", "MN", "564", "MN", "565", "MN", "566", "MN",
- "567", "MN", "570", "SD", "571", "SD", "572", "SD", "573", "SD",
- "574", "SD", "575", "SD", "576", "SD", "577", "SD", "580", "ND",
- "581", "ND", "582", "ND", "583", "ND", "584", "ND", "585", "ND",
- "586", "ND", "587", "ND", "588", "ND", "590", "MT", "591", "MT",
- "592", "MT", "593", "MT", "594", "MT", "595", "MT", "596", "MT",
- "597", "MT", "598", "MT", "599", "MT", "600", "IL", "601", "IL",
- "602", "IL", "603", "IL", "604", "IL", "605", "IL", "606", "IL",
- "609", "IL", "610", "IL", "611", "IL", "612", "IL", "613", "IL",
- "614", "IL", "615", "IL", "616", "IL", "617", "IL", "618", "IL",
- "619", "IL", "620", "IL", "621", "IL", "622", "IL", "623", "IL",
- "624", "IL", "625", "IL", "626", "IL", "627", "IL", "628", "IL",
- "629", "IL", "630", "MO", "631", "MO", "633", "MO", "634", "MO",
- "635", "MO", "636", "MO", "637", "MO", "638", "MO", "639", "MO",
- "640", "MO", "641", "MO", "644", "MO", "645", "MO", "646", "MO",
- "647", "MO", "648", "MO", "650", "MO", "651", "MO", "652", "MO",
- "653", "MO", "654", "MO", "655", "MO", "656", "MO", "657", "MO",
- "658", "MO", "660", "KS", "661", "KS", "662", "KS", "664", "KS",
- "665", "KS", "666", "KS", "667", "KS", "668", "KS", "669", "KS",
- "670", "KS", "671", "KS", "672", "KS", "673", "KS", "674", "KS",
- "675", "KS", "676", "KS", "677", "KS", "678", "KS", "679", "KS",
- "680", "NE", "681", "NE", "683", "NE", "684", "NE", "685", "NE",
- "686", "NE", "687", "NE", "688", "NE", "689", "NE", "690", "NE",
- "691", "NE", "692", "NE", "693", "NE", "700", "LA", "701", "LA",
- "703", "LA", "704", "LA", "705", "LA", "706", "LA", "707", "LA",
- "708", "LA", "710", "LA", "711", "LA", "712", "LA", "713", "LA",
- "714", "LA", "716", "AR", "717", "AR", "718", "AR", "719", "AR",
- "720", "AR", "721", "AR", "722", "AR", "723", "AR", "724", "AR",
- "725", "AR", "726", "AR", "727", "AR", "728", "AR", "729", "AR",
- "730", "OK", "731", "OK", "734", "OK", "735", "OK", "736", "OK",
- "737", "OK", "738", "OK", "739", "OK", "740", "OK", "741", "OK",
- "743", "OK", "744", "OK", "745", "OK", "746", "OK", "747", "OK",
- "748", "OK", "749", "OK", "750", "TX", "751", "TX", "752", "TX",
- "753", "TX", "754", "TX", "755", "TX", "756", "TX", "757", "TX",
- "758", "TX", "759", "TX", "760", "TX", "761", "TX", "762", "TX",
- "763", "TX", "764", "TX", "765", "TX", "766", "TX", "767", "TX",
- "768", "TX", "769", "TX", "770", "TX", "771", "TX", "772", "TX",
- "773", "TX", "774", "TX", "775", "TX", "776", "TX", "777", "TX",
- "778", "TX", "779", "TX", "780", "TX", "781", "TX", "782", "TX",
- "783", "TX", "784", "TX", "785", "TX", "786", "TX", "787", "TX",
- "788", "TX", "789", "TX", "790", "TX", "791", "TX", "792", "TX",
- "793", "TX", "794", "TX", "795", "TX", "796", "TX", "797", "TX",
- "798", "TX", "799", "TX", "800", "CO", "801", "CO", "802", "CO",
- "803", "CO", "804", "CO", "805", "CO", "806", "CO", "807", "CO",
- "808", "CO", "809", "CO", "810", "CO", "811", "CO", "812", "CO",
- "813", "CO", "814", "CO", "815", "CO", "816", "CO", "820", "WY",
- "821", "WY", "822", "WY", "823", "WY", "824", "WY", "825", "WY",
- "826", "WY", "827", "WY", "828", "WY", "829", "WY", "830", "WY",
- "831", "WY", "832", "ID", "833", "ID", "834", "ID", "835", "ID",
- "836", "ID", "837", "ID", "838", "ID", "840", "UT", "841", "UT",
- "842", "UT", "843", "UT", "844", "UT", "845", "UT", "846", "UT",
- "847", "UT", "850", "AZ", "851", "AZ", "852", "AZ", "853", "AZ",
- "855", "AZ", "856", "AZ", "857", "AZ", "859", "AZ", "860", "AZ",
- "863", "AZ", "864", "AZ", "865", "AZ", "870", "NM", "871", "NM",
- "872", "NM", "873", "NM", "874", "NM", "875", "NM", "877", "NM",
- "878", "NM", "879", "NM", "880", "NM", "881", "NM", "882", "NM",
- "883", "NM", "884", "NM", "889", "NV", "890", "NV", "891", "NV",
- "893", "NV", "894", "NV", "895", "NV", "897", "NV", "898", "NV",
- "900", "CA", "901", "CA", "902", "CA", "903", "CA", "904", "CA",
- "905", "CA", "906", "CA", "907", "CA", "908", "CA", "910", "CA",
- "911", "CA", "912", "CA", "913", "CA", "914", "CA", "915", "CA",
- "916", "CA", "917", "CA", "918", "CA", "920", "CA", "921", "CA",
- "922", "CA", "923", "CA", "924", "CA", "925", "CA", "926", "CA",
- "927", "CA", "928", "CA", "930", "CA", "931", "CA", "932", "CA",
- "933", "CA", "934", "CA", "935", "CA", "936", "CA", "937", "CA",
- "939", "CA", "940", "CA", "941", "CA", "942", "CA", "943", "CA",
- "944", "CA", "945", "CA", "946", "CA", "947", "CA", "948", "CA",
- "949", "CA", "950", "CA", "951", "CA", "952", "CA", "953", "CA",
- "954", "CA", "955", "CA", "956", "CA", "957", "CA", "958", "CA",
- "959", "CA", "960", "CA", "961", "CA", "967", "HI", "968", "HI",
- "970", "OR", "971", "OR", "972", "OR", "973", "OR", "974", "OR",
- "975", "OR", "976", "OR", "977", "OR", "978", "OR", "979", "OR",
- "980", "WA", "981", "WA", "982", "WA", "983", "WA", "984", "WA",
- "985", "WA", "986", "WA", "987", "WA", "988", "WA", "989", "WA",
- "990", "WA", "991", "WA", "992", "WA", "993", "WA", "994", "WA",
- "995", "AK", "996", "AK", "997", "AK", "998", "AK", "999", "AK"
- };
-
- /* Get the number of entries in the zipcode table... */
- #define TABLE_LENGTH (sizeof(zip_table) / sizeof(struct zip)) - 1
-
- /* =================================================================== */
- /* MAIN PROCEDURE - EVALUATE ZIPCODE */
- /* =================================================================== */
-
- pascal void main (paramPtr)
- XCmdBlockPtr paramPtr;
-
- {
- int zip_tab;
- RememberA0();
- SetUpA4();
-
- /* First, check for appropriate length of zipcode */
- zip_tab = strlen( *(paramPtr->params[0]) );
- if (zip_tab != 5 && zip_tab != 10)
- zip_tab = -1;
- if (zip_tab == -1)
- SysBeep(1); /* we been beeping twice on the screwy lengths */
-
- /* If length is OK then see if it's a valid zipcode */
- else
- zip_tab = state_name(paramPtr);
-
- /* If there is an error, beep and exit with empty result */
- if (zip_tab < 0)
- SysBeep(1);
-
- /* Otherwise, return the correct state abbreviation */
- else {
-
- paramPtr->returnValue = NewHandle(3);
- **(paramPtr->returnValue) = zip_table[zip_tab].state[0];
- *(*paramPtr->returnValue + 1) = zip_table[zip_tab].state[1];
- *(*paramPtr->returnValue + 2) = '\0';
- }
-
- RestoreA4();
- return;
- }
-
- /* =================================================================== */
- /* function to find and return array index number to correct state */
- /* abbreviation, given a pointer to the entered zipcode */
- /* =================================================================== */
-
- int state_name (paramPtr)
- XCmdBlockPtr paramPtr;
- {
- register top = 0;
- register bottom = TABLE_LENGTH;
- register midpoint = 1;
- register flag = -1;
-
- while ( (flag < 0) && (midpoint >= (top-1) ) ) {
-
- /* set the primary index check <midpoint> */
- if ( ( (bottom - top) % 2) > 0)
- (midpoint = (bottom - top) / 2) + 1;
- else if (bottom != top)
- midpoint = (bottom - top) / 2;
- else
- break; /* SOMETHING IS WROGHTEN IN DINMARK - BAIL OUT! */
-
- /* check outer boundaries of search <top><bottom> for hit */
- if (compare(paramPtr, top) == 0)
- flag = top;
-
- else if (compare(paramPtr, bottom) == 0)
- flag = bottom;
-
- /* ...if flag was reset to >=0 guess what! there was a hit */
- if (flag >= 0)
- break;
-
- /* otherwise, check the new <midpoint> */
- switch (compare(paramPtr, midpoint)) {
-
- /* 3-DIGIT ZIP = TABLE ENTRY */
- case 0: flag = midpoint;
- break;
-
- /* 3-DIGIT ZIP > TABLE ENTRY */
- case 1: top = midpoint + 1;
- bottom--;
- break;
-
- /* 3-DIGIT ZIP < TABLE ENTRY */
- case 2: bottom = midpoint - 1;
- top++;
- break;
-
- } /* END OF SWITCH STATEMENT */
-
- } /* END OF WHILE STATEMENT */
-
- return(flag);
-
- } /* END OF FUNCTION */
-
- /* =================================================================== */
- /* function to return FLAG signalling <, =, > comparison result, */
- /* given pointer to entered zipcode, and the array index pointer */
- /* =================================================================== */
-
- int compare (paramPtr, zip_ptr)
- XCmdBlockPtr paramPtr; int zip_ptr;
- {
- register comp, flag;
- flag = 0;
-
- /* for first 3 characters of zipcode:
- return <0 if zipcode < table entry
- return =0 if zipcode == table entry
- return >0 if zipcode > table entry */
-
- comp = strncmp( *(paramPtr->params[0]), &zip_table[zip_ptr].zipcode[0], 3 );
- if (comp < 0)
- flag = 2;
- else if (comp > 0)
- flag = 1;
- return(flag);
- }
-